package com.yh.vo;

import com.yh.entity.Director;
import com.yh.entity.Movie;
import com.yh.utils.UploadAndDownload;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Setter
@Getter
@ToString
/**
 * 电影详情数据模型，记录每部电影的详细信息。不提供无参构造，因为关系映射列表和角色模型列表需要根据
 * 电影实体信息才能执行初始化；如果希望直接响应空模型请使用'buildNullRespInstance'方法
 * @actorNames 关系映射列表，保存的演员姓名顺序与角色模型列表中的电影角色顺序是一致的
 * @actorRoles 电影角色的数据模型列表。数据模型中封装了电影角色和演职人员的信息
 * @comments 影评模型列表。记录了关于该电影的所有影评信息
 *
 * @author yuhuan
 * @date 2022/01/13
 * */
public class MovieVO implements Serializable {
    /**
     * 日志
     */
    private static final Logger logger = Logger.getLogger(MovieVO.class);

    private Integer movieId;
    private String movieCnName;
    private String movieFgName;
    /**
     * 饰演列表(演员与饰演的角色)
     */
    private List<String> movieActor;
    /**
     * 关联的导演ID
     */
    private Integer movieDirectorId;
    /**
     * 影片主演
     */
    private List<String> movieStar;
    /**
     * 关联的所有演员ID
     */
    private List<String> movieActorIds;
    /**
     * 电影详情
     */
    private String movieExplain;
    /**
     * 电影时长
     */
    private String movieDuration;
    /**
     * 电影类型
     */
    private String movieType;
    /**
     * 上映时间
     */
    private Date movieReleaseDate;
    /**
     * 电影海报地址
     */
    private String moviePicture;
    /**
     * 制片地区
     */
    private String movieCountry;
    /**
     * 用于海报的上传和下载
     */
    private MultipartFile movieFile;

    /**
     * 电影评分
     */
    private Double movieScore;
    /**
     * 电影状态 默认1 1：在线 0：下架
     */
    private Integer movieState;

    /**
     * 电影实体信息
     */
    private Movie movie;
    /**
     * 影片的导演实体信息
     */
    private Director director;
    /**
     * 用影片所有主演的姓名和空格拼接而成的字符串
     */
    private String starNameToStr;

    /**
     * 关系映射列表。从饰演列表中提取了所有演员的姓名
     */
    private List<String> actorNames;
    /**
     * 从饰演列表中提取了演员扮演的角色
     */
    private List<MovieRoleVO> actorRoles;

    private MovieVO() {
    }

    public MovieVO(Movie movie) {
        this(movie, null);
    }

    public MovieVO(Movie movie, Director director) {
        this.movie = movie;
        this.director = director;
        init();
    }

    /**
     * 初始化电影角色与演员的映射关系
     * "actorNames"列表与"actorRoles"列表保证了角色与演员的映射关系。例如-甄子丹饰叶问。如果
     * 甄子丹在actorNames中的1号索引，那么叶问这个角色的数据模型也将存储在actorRoles中对应的1
     * 号索引位置，基于这个映射关系可以将数据库中查询到的演员信息正确地绑定到对应的电影角色模型中
     */
    private void init() {
        this.actorNames = new ArrayList<>();
        this.actorRoles = new ArrayList<>();
        // 取出演职人员的饰演信息，取出的数据格式将会类似"甄子丹:叶问"的字符串集合
        List<String> movieActors = movie.getMovieActor();
        // 如果映射关系不存在，则将状态码标记为不完整
        if (movieActors.isEmpty()) {
            logger.debug(">>>>> 数据模型在初始化映射关系时失败!");
            return;
        }
        // 记录映射关系。冒号左边是演员姓名，右边是电影角色
        movieActors.forEach(s -> {
            actorNames.add(s.split(":")[0]);
            MovieRoleVO roleVO = new MovieRoleVO();
            roleVO.setActorRole(s.split(":")[1]);
            actorRoles.add(roleVO);
        });
    }

    public void setMovie(Movie movie) {
        this.movie = movie;
        init();
    }
}
